home *** CD-ROM | disk | FTP | other *** search
/ Delphi 2.0 - Programmer's Utilities Power Pack / Delphi 2.0 Programmer's Utilities Power Pack.iso / s_to_z / xtool / xtreg.pas < prev   
Encoding:
Pascal/Delphi Source File  |  1996-09-15  |  7.0 KB  |  250 lines

  1. unit Xtreg;
  2.  
  3. interface
  4.  
  5. uses Classes, SysUtils, DsgnIntf, Consts;
  6.  
  7. procedure Register;
  8.  
  9. implementation
  10.  
  11. uses Db, DbTables, DbNextNo, DSDesign, TypInfo, Toolbar;
  12.  
  13. { ======================================================================= }
  14. { design stuff for TButtonBmp                                             }
  15. { ======================================================================= }
  16. type
  17.   TButtonEntry = record
  18.     Value : TButtonBmp;
  19.     Name  : PChar;
  20.   end;
  21.  
  22. const
  23.   _Buttons: array[0..34] of TButtonEntry = (
  24.    (Value: bbExit;         Name: 'bbExit'),
  25.    (Value: bbCalender;     Name: 'bbCalender'),
  26.    (Value: bbCopy;         Name: 'bbCopy'),
  27.    (Value: bbScissor;      Name: 'bbScissor'),
  28.    (Value: bbCut;          Name: 'bbCut'),
  29.    (Value: bbFont;         Name: 'bbFont'),
  30.    (Value: bbHelp;         Name: 'bbHelp'),
  31.    (Value: bbIdea;         Name: 'bbIdea'),
  32.    (Value: bbLetter;       Name: 'bbLetter'),
  33.    (Value: bbLink;         Name: 'bbLink'),
  34.    (Value: bbOpen;         Name: 'bbOpen'),
  35.    (Value: bbFile;         Name: 'bbFile'),
  36.    (Value: bbKey;          Name: 'bbKey'),
  37.    (Value: bbNotebook;     Name: 'bbNotebook'),
  38.    (Value: bbClipBrd;      Name: 'bbClipBrd'),
  39.    (Value: bbPhone;        Name: 'bbPhone'),
  40.    (Value: bbPrint;        Name: 'bbPrint'),
  41.    (Value: bbSave;         Name: 'bbSave'),
  42.    (Value: bbFloppy;       Name: 'bbFloppy'),
  43.    (Value: bbSearch;       Name: 'bbSearch'),
  44.    (Value: bbRuler;        Name: 'bbRuler'),
  45.    (Value: bbTimer;        Name: 'bbTimer'),
  46.    (Value: bbWaste;        Name: 'bbWaste'),
  47.    (Value: bbUndo;         Name: 'bbUndo'),
  48.    (Value: bbClear;        Name: 'bbClear'),
  49.    (Value: bbBrowse;       Name: 'bbBrowse'),
  50.    (Value: bbCancel;       Name: 'bbCancel'),
  51.    (Value: bbTrash;        Name: 'bbTrash'),
  52.    (Value: bbFirst;        Name: 'bbFirst'),
  53.    (Value: bbNew;          Name: 'bbNew'),
  54.    (Value: bbLast;         Name: 'bbLast'),
  55.    (Value: bbNext;         Name: 'bbNext'),
  56.    (Value: bbOk;           Name: 'bbOk'),
  57.    (Value: bbPrinter;      Name: 'bbPrinter'),
  58.    (Value: bbPrior;        Name: 'bbPrior'));
  59.  
  60. { ----------------------------------------------------------------------- }
  61.  
  62. procedure GetButtonValues(Proc: TGetStrProc);
  63. var
  64.   I: Integer;
  65. begin
  66.   for I := Low(_Buttons) to High(_Buttons) do
  67.     Proc(StrPas(_Buttons[I].Name));
  68. end;
  69.  
  70. { ----------------------------------------------------------------------- }
  71.  
  72. function ButtonToIdent(Button: Integer; var Ident: string): Boolean;
  73. var
  74.   I: Integer;
  75. begin
  76.   Result := False;
  77.   for I := Low(_Buttons) to High(_Buttons) do
  78.     if _Buttons[I].Value = Button then
  79.     begin
  80.       Result := True;
  81.       Ident := StrPas(_Buttons[I].Name);
  82.       Exit;
  83.     end;
  84. end;
  85.  
  86. function ButtonToString(Button: TButtonBmp): string;
  87. begin
  88.   if not ButtonToIdent(Button, Result) then
  89.     Result:=IntToStr(Button);
  90. end;
  91.  
  92. { ----------------------------------------------------------------------- }
  93.  
  94. function IdentToButton(const Ident: string; var Button: Integer): Boolean;
  95. var
  96.   I: Integer;
  97.   Text: array[0..63] of Char;
  98. begin
  99.   Result := False;
  100.   StrPLCopy(Text, Ident, SizeOf(Text) - 1);
  101.   for I := Low(_Buttons) to High(_Buttons) do
  102.     if StrIComp(_Buttons[I].Name, Text) = 0 then
  103.     begin
  104.       Result := True;
  105.       Button:= _Buttons[I].Value;
  106.       Exit;
  107.     end;
  108. end;
  109.  
  110. { ----------------------------------------------------------------------- }
  111.  
  112. function StringToButton(S: string): TButtonBmp;
  113. var
  114.   L: Longint;
  115.   E: Integer;
  116. begin
  117.   if not IdentToButton(S, Integer(Result)) then
  118.   begin
  119.     Val(S, L, E);
  120.     if E <> 0 then raise Exception.Create(LoadStr(SInvalidInteger));
  121.     if (L < Low(TButtonBmp)) or (L > High(TButtonBmp)) then
  122.       raise Exception.Create(
  123.         FmtLoadStr(SOutOfRange, [Low(TButtonBmp), High(TButtonBmp)]));
  124.     Result := TButtonBmp(L);
  125.   end;
  126. end;
  127.  
  128.  
  129.  
  130. { TButtonProperty
  131.   Property editor for the TBmpIndex type.  Displays the button
  132.   as a btnXXXX value if one exists, otherwise displays the value as integer.
  133.   Also allows the btnXXX value to be picked from a list. }
  134. type
  135.   TButtonProperty = class(TIntegerProperty)
  136.   public
  137.     function  GetAttributes: TPropertyAttributes; override;
  138.     function  GetValue: string; override;
  139.     procedure GetValues(Proc: TGetStrProc); override;
  140.     procedure SetValue(const Value: string); override;
  141.   end;
  142.  
  143.  
  144. { TButtonProperty }
  145.  
  146. function TButtonProperty.GetAttributes: TPropertyAttributes;
  147. begin
  148.   Result := [paMultiSelect, paValueList];
  149. end;
  150.  
  151. function TButtonProperty.GetValue: string;
  152. begin
  153.   Result := ButtonToString(TButtonBmp(GetOrdValue));
  154. end;
  155.  
  156. procedure TButtonProperty.GetValues(Proc: TGetStrProc);
  157. begin
  158.   GetButtonValues(Proc);
  159. end;
  160.  
  161. procedure TButtonProperty.SetValue(const Value: string);
  162. var
  163.   NewValue: Integer;
  164. begin
  165.   if IdentToButton(Value, NewValue) then
  166.     SetOrdValue(NewValue)
  167.   else inherited SetValue(Value);
  168. end;
  169.  
  170. { TDBStringProperty }
  171.  
  172. type
  173.   TDBStringProperty = class(TStringProperty)
  174.   public
  175.     function GetAttributes: TPropertyAttributes; override;
  176.     procedure GetValueList(List: TStrings); virtual; abstract;
  177.     procedure GetValues(Proc: TGetStrProc); override;
  178.   end;
  179.  
  180. function TDBStringProperty.GetAttributes: TPropertyAttributes;
  181. begin
  182.   Result := [paValueList, paSortList, paMultiSelect];
  183. end;
  184.  
  185. procedure TDBStringProperty.GetValues(Proc: TGetStrProc);
  186. var
  187.   I: Integer;
  188.   Values: TStringList;
  189. begin
  190.   Values := TStringList.Create;
  191.   try
  192.     GetValueList(Values);
  193.     for I := 0 to Values.Count - 1 do Proc(Values[I]);
  194.   finally
  195.     Values.Free;
  196.   end;
  197. end;
  198.  
  199. { TDataFieldProperty }
  200.  
  201. type
  202.   TDataFieldProperty = class(TDBStringProperty)
  203.   public
  204.     function GetDataSourcePropName: string; virtual;
  205.     procedure GetValueList(List: TStrings); override;
  206.   end;
  207.  
  208. function TDataFieldProperty.GetDataSourcePropName: string;
  209. begin
  210.   Result := 'DataSource';
  211. end;
  212.  
  213. procedure TDataFieldProperty.GetValueList(List: TStrings);
  214. var
  215.   Instance: TComponent;
  216.   PropInfo: PPropInfo;
  217.   DataSource: TDataSource;
  218. begin
  219.   Instance := GetComponent(0);
  220.   PropInfo := TypInfo.GetPropInfo(Instance.ClassInfo, GetDataSourcePropName);
  221.   if (PropInfo <> nil) and (PropInfo^.PropType^.Kind = tkClass) then
  222.   begin
  223.     DataSource := TObject(GetOrdProp(Instance, PropInfo)) as TDataSource;
  224.     if (DataSource <> nil) and (DataSource.DataSet <> nil) then
  225.       DataSource.DataSet.GetFieldNames(List);
  226.   end;
  227. end;
  228.  
  229. { TNextNoFieldProperty }
  230.  
  231. type
  232.   TNextNoFieldProperty = class(TDataFieldProperty)
  233.   public
  234.     function GetDataSourcePropName: string; override;
  235.   end;
  236.  
  237. function TNextNoFieldProperty.GetDataSourcePropName: string;
  238. begin
  239.   Result := 'NextNoSource';
  240. end;
  241.  
  242. procedure Register;
  243. begin
  244.   RegisterPropertyEditor(TypeInfo(string), TDbNextNo, 'KeyField', TNextNoFieldProperty);
  245.   RegisterPropertyEditor(TypeInfo(string), TDbNextNo, 'NoField', TNextNoFieldProperty);
  246.   RegisterPropertyEditor(TypeInfo(TButtonBmp), nil, 'Button', TButtonProperty);
  247. end;
  248.  
  249. end.
  250.